/*
 * JFugue - API for Music Programming
 * Copyright (C) 2003-2008  David Koelle
 *
 * http://www.jfugue.org
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */

package org.jfugue;

/**
 * Contains information for MIDI Controller Events.
 *
 * @author David Koelle
 * @version 2.0
 */
public final class Controller implements JFugueElement {
	byte index;
	byte value;

	/** Creates a new Controller object */
	public Controller() {
		this.index = 0;
		this.value = 0;
	}

	/**
	 * Creates a new Controller object, with the specified controller index and
	 * value.
	 *
	 * @param index
	 *            the index of the controller to set
	 * @param value
	 *            the byte value used to set the controller
	 */
	public Controller(byte index, byte value) {
		this.index = index;
		this.value = value;
	}

	/**
	 * TODO: This method, which is currently not supported, is intended to take
	 * an integer, which contains the MSB and LSB bytes of a controller event,
	 * and parse the integer to the MSB and LSB. Currently, this feature is
	 * handled by MusicStringParser, and has not been rolled into the Controller
	 * class (where it should really belong). One difficulty to consider is that
	 * an integer representing an MSB and an LSB actually means that there are
	 * two Controller instances, not just one. Of course, the Controller class
	 * itself represents only one controller event.
	 *
	 * @param index
	 * @param value
	 */
	// public Controller(int index, byte value)
	// {
	// throw new UnsupportedOperationException("Controller(int index, byte
	// value) is not supported. If you're using a byte for the controller index,
	// cast your index appropriately to use Controller(byte index, byte
	// value).");
	// }

	/**
	 * Sets the index of the controller event for this object.
	 * 
	 * @param index
	 *            the index of the controller
	 */
	public void setIndex(byte index) {
		this.index = index;
	}

	/**
	 * Returns the index of the controller event for this object.
	 * 
	 * @return the index of the controller
	 */
	public byte getIndex() {
		return this.index;
	}

	/**
	 * Sets the value of the controller event for this object.
	 * 
	 * @param value
	 *            the byte value used to set the controller
	 */
	public void setValue(byte value) {
		this.value = value;
	}

	/**
	 * Returns the value of the controller event for this object.
	 * 
	 * @return the value of the controller
	 */
	public byte getValue() {
		return this.value;
	}

	/**
	 * Returns the Music String representing this element and all of its
	 * settings. For a Controller object, the Music String is <code>X</code>
	 * <i>index</i>=<i>value</i>
	 * 
	 * @return the Music String for this element
	 */
	@Override
	public String getMusicString() {
		StringBuffer buffy = new StringBuffer();
		buffy.append("X");
		buffy.append(getIndex());
		buffy.append("=");
		buffy.append(getValue());
		return buffy.toString();
	}

	/**
	 * Returns verification string in this format: Controller: index={#},
	 * value={#}
	 * 
	 * @version 4.0
	 */
	@Override
	public String getVerifyString() {
		StringBuffer buffy = new StringBuffer();
		buffy.append("Controller: index=");
		buffy.append(getIndex());
		buffy.append(", value=");
		buffy.append(getValue());
		return buffy.toString();
	}

	public static final byte BANK_SELECT_COARSE = 0;
	public static final byte MOD_WHEEL_COARSE = 1;
	public static final byte BREATH_COARSE = 2;
	public static final byte FOOT_PEDAL_COARSE = 4;
	public static final byte PORTAMENTO_TIME_COARSE = 5;
	public static final byte DATA_ENTRY_COARSE = 6;
	public static final byte VOLUME_COARSE = 7;
	public static final byte BALANCE_COARSE = 8;
	public static final byte PAN_POSITION_COARSE = 10;
	public static final byte EXPRESSION_COARSE = 11;
	public static final byte EFFECT_CONTROL_1_COARSE = 12;
	public static final byte EFFECT_CONTROL_2_COARSE = 13;

	public static final byte SLIDER_1 = 16;
	public static final byte SLIDER_2 = 17;
	public static final byte SLIDER_3 = 18;
	public static final byte SLIDER_4 = 19;

	public static final byte BANK_SELECT_FINE = 32;
	public static final byte MOD_WHEEL_FINE = 33;
	public static final byte BREATH_FINE = 34;
	public static final byte FOOT_PEDAL_FINE = 36;
	public static final byte PORTAMENTO_TIME_FINE = 37;
	public static final byte DATA_ENTRY_FINE = 38;
	public static final byte VOLUME_FINE = 39;
	public static final byte BALANCE_FINE = 40;
	public static final byte PAN_POSITION_FINE = 42;
	public static final byte EXPRESSION_FINE = 43;
	public static final byte EFFECT_CONTROL_1_FINE = 44;
	public static final byte EFFECT_CONTROL_2_FINE = 45;

	public static final byte HOLD_PEDAL = 64;
	public static final byte HOLD = 64;
	public static final byte PORTAMENTO = 65;
	public static final byte SUSTENUTO_PEDAL = 66;
	public static final byte SUSTENUTO = 66;
	public static final byte SOFT_PEDAL = 67;
	public static final byte SOFT = 67;
	public static final byte LEGATO_PEDAL = 68;
	public static final byte LEGATO = 68;
	public static final byte HOLD_2_PEDAL = 69;
	public static final byte HOLD_2 = 69;

	public static final byte SOUND_VARIATION = 70;
	public static final byte VARIATION = 70;
	public static final byte SOUND_TIMBRE = 71;
	public static final byte TIMBRE = 71;
	public static final byte SOUND_RELEASE_TIME = 72;
	public static final byte RELEASE_TIME = 72;
	public static final byte SOUND_ATTACK_TIME = 73;
	public static final byte ATTACK_TIME = 73;
	public static final byte SOUND_BRIGHTNESS = 74;
	public static final byte BRIGHTNESS = 74;
	public static final byte SOUND_CONTROL_6 = 75;
	public static final byte CONTROL_6 = 75;
	public static final byte SOUND_CONTROL_7 = 76;
	public static final byte CONTROL_7 = 76;
	public static final byte SOUND_CONTROL_8 = 77;
	public static final byte CONTROL_8 = 77;
	public static final byte SOUND_CONTROL_9 = 78;
	public static final byte CONTROL_9 = 78;
	public static final byte SOUND_CONTROL_10 = 79;
	public static final byte CONTROL_10 = 79;

	public static final byte GENERAL_PURPOSE_BUTTON_1 = 80;
	public static final byte GENERAL_BUTTON_1 = 80;
	public static final byte BUTTON_1 = 80;
	public static final byte GENERAL_PURPOSE_BUTTON_2 = 81;
	public static final byte GENERAL_BUTTON_2 = 81;
	public static final byte BUTTON_2 = 81;
	public static final byte GENERAL_PURPOSE_BUTTON_3 = 82;
	public static final byte GENERAL_BUTTON_3 = 82;
	public static final byte BUTTON_3 = 82;
	public static final byte GENERAL_PURPOSE_BUTTON_4 = 83;
	public static final byte GENERAL_BUTTON_4 = 83;
	public static final byte BUTTON_4 = 83;

	public static final byte EFFECTS_LEVEL = 91;
	public static final byte EFFECTS = 91;
	public static final byte TREMULO_LEVEL = 92;
	public static final byte TREMULO = 92;
	public static final byte CHORUS_LEVEL = 93;
	public static final byte CHORUS = 93;
	public static final byte CELESTE_LEVEL = 94;
	public static final byte CELESTE = 94;
	public static final byte PHASER_LEVEL = 95;
	public static final byte PHASER = 95;

	public static final byte DATA_BUTTON_INCREMENT = 96;
	public static final byte DATA_BUTTON_INC = 96;
	public static final byte BUTTON_INC = 96;
	public static final byte DATA_BUTTON_DECREMENT = 97;
	public static final byte DATA_BUTTON_DEC = 97;
	public static final byte BUTTON_DEC = 97;

	public static final byte NON_REGISTERED_COARSE = 98;
	public static final byte NON_REGISTERED_FINE = 99;
	public static final byte REGISTERED_COARSE = 100;
	public static final byte REGISTERED_FINE = 101;

	public static final byte ALL_SOUND_OFF = 120;
	public static final byte ALL_CONTROLLERS_OFF = 121;
	public static final byte LOCAL_KEYBOARD = 122;
	public static final byte ALL_NOTES_OFF = 123;
	public static final byte OMNI_MODE_OFF = 124;
	public static final byte OMNI_OFF = 124;
	public static final byte OMNI_MODE_ON = 125;
	public static final byte OMNI_ON = 125;
	public static final byte MONO_OPERATION = 126;
	public static final byte MONO = 126;
	public static final byte POLY_OPERATION = 127;
	public static final byte POLY = 127;

	//
	// Combined Controller names
	// (index = coarse_controller_index * 128 + fine_controller_index)
	//
	public static final int BANK_SELECT = 16383;
	public static final int MOD_WHEEL = 161;
	public static final int BREATH = 290;
	public static final int FOOT_PEDAL = 548;
	public static final int PORTAMENTO_TIME = 677;
	public static final int DATA_ENTRY = 806;
	public static final int VOLUME = 935;
	public static final int BALANCE = 1064;
	public static final int PAN_POSITION = 1322;
	public static final int EXPRESSION = 1451;
	public static final int EFFECT_CONTROL_1 = 1580;
	public static final int EFFECT_CONTROL_2 = 1709;
	public static final int NON_REGISTERED = 12770;
	public static final int REGISTERED = 13028;

	//
	// Values for controllers
	//
	public static final byte ON = 127;
	public static final byte OFF = 0;
	public static final byte DEFAULT = 64;

}